<?php

class Application_Model_BenutzerMapper
{
	protected $_dbTable;

	public function setDbTable($dbTable)
	{
		if (is_string($dbTable)) {
			$dbTable = new $dbTable();
		}
		if (!$dbTable instanceof Zend_Db_Table_Abstract) {
			throw new Exception('Invalid table data gateway provided');
		}
		$this->_dbTable = $dbTable;
		return $this;
	}
    
	public function getDbTable()
	{
		if (null === $this->_dbTable) {
			$this->setDbTable('Application_Model_DbTable_Benutzer');
		}
		return $this->_dbTable;
	}
	
	//Benutzer wird angelegt
	public function anlegen(Application_Model_Benutzer $benutzer)
	{
		$data = array(
            'passwort'   => $benutzer->getPasswort(),
            'name' => $benutzer->getName(),
            'vorname' => $benutzer->getVorname(),
            'status' => $benutzer->getStatus(),
		);

		$this->getDbTable()->insert($data);
	}

	//Funktion zur überprüfung, ob der benutzer existiert
	public function userExists($nr=null){
		$ergebnis;
		$table = $this->getDbTable();
		$tempnr = $table->fetchAll($table->select('nr')
     						->where('nr = ?',$nr)); 	
		
     	if (sizeof($tempnr) >0) {
			$ergebnis = true;
		}else{
			$ergebnis= false;
		}
		return $ergebnis;
	}
	
	//funktion zur überprüfung, ob das passwort richtig ist
	public function pruefePasswort($nr=null,$passwort=null){
		$ergebnis;
		$table = $this->getDbTable();
		//md5hash für passwort erzeugen
		
		$temppasswort = $table->fetchAll($table->select('passwort')
     						->where('nr = ?',$nr)
     						->where('passwort = ?',md5($passwort)));//hier den md5hash vergleichen
		if (sizeof($temppasswort)>0) {
			$ergebnis = true;
		}else{
			$ergebnis = false;
		}
		
		return $ergebnis;
	}

	//der status wird abhänigig von der benutzernummer zurückgegeben
	public function getStatus($nr){
		$ergebnis;
		$table = $this->getDbTable();
		//abfrage an die datenbank
		$temp = $table->fetchAll($table->select()
     						->where ('nr = ?',$nr));
		//frage ist ob man das überhaupt braucht, denn die getStatus()- methode
		//wird erst ausgeführt, wenn man schon überprüft hat, ob der user existiert
		if($this->userExists($nr)==true){
			$ergebnis=$temp[0]->status;
		}else{
			$ergebnis=false;
		}
		return $ergebnis;
	}
	
	//es werden alle benutzer zurückgegeben
	public function  fetchAll(){
     	$resultSet = $this->getDbTable()->fetchAll();
     	$entries = array();
     	foreach ($resultSet as $row) {
     		$entry = new Application_Model_Benutzer();
     		$entry->setNr($row->nr);
     		$entry->setName($row->name);
     		$entry->setVorname($row->vorname);
     		$entry->setStatus($row->status);
     		
     		$entries[] = $entry;
     	}
     	return $entries;
	}
	
	//es wird ein einzelner benutzer abhängig von der benutzernummer zurückgegeben
	public function fetchBenutzer($nr = null){
     	$table = $this->getDbTable();
     	$entries = array();
     	$resultSet = $table->fetchAll($table->select()
     						->where('nr = ?',$nr));
     		foreach ($resultSet as $row) {
     		$entry = new Application_Model_Benutzer();
     		$entry->setNr($row->nr);
     		$entry->setName($row->name);
     		$entry->setVorname($row->vorname);
     		$entry->setStatus($row->status);
     		
     		$entries[] = $entry;
     		}
     	return $entries;
     }
     
     //dient dazu eine benutzernummer zu finden, wenn man die anderen parameter hat
     public function benutzerSuchen($name=null,$vorname=null,$status=null,$passwort=null){
     	$table = $this->getDbTable();
     	$entries = array();
     	$resultSet = $table->fetchAll($table->select()
     						->where('name = ?',$name)
     						->where('vorname = ?',$vorname)
     						->where('status = ?',$status)
     						->where('passwort = ?',$passwort));
     		foreach ($resultSet as $row) {
     		$entry = new Application_Model_Benutzer();
     		$entry->setNr($row->nr);
     		$entry->setName($row->name);
     		$entry->setVorname($row->vorname);
     		$entry->setStatus($row->status);
     		$entry->setPasswort($row->passwort);
     		
     		$entries[] = $entry;
     		}
     	return $entries;
     }
     
     //benutzer wird aus der db gelöscht
     public function loeschen($nr){
     	
     	$this->getDbTable()->delete(array('nr = ?' => $nr));
     }
	
     //benutzer wird abhängig von der benutzernummer in der datenbank aktualisiert
     public function aendern(Application_Model_Benutzer $benutzer, $nr)
     {

     	$data = array(
            'passwort'   =>$benutzer->getPasswort(),
            'name' => $benutzer->getName(),
            'vorname' => $benutzer->getVorname(),
            'status' => $benutzer->getStatus(),
		);
		
		$this->getDbTable()->update($data, array('nr = ?' => $nr));
     }
}